package middleware

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"go-ecommerce/internal/utils"
	"net/http"
	"runtime/debug"
)

// ErrorHandler 全局异常捕获中间件
func ErrorHandler() gin.HandlerFunc {
	return func(c *gin.Context) {
		defer func() {
			if r := recover(); r != nil {
				// 获取堆栈信息
				stack := string(debug.Stack())

				// 构造错误信息
				errMsg := fmt.Sprintf("%v", r)

				// 记录详细错误日志
				utils.Logger.Error().
					Str("error", errMsg).
					Str("stack", stack).
					Str("path", c.Request.URL.Path).
					Str("method", c.Request.Method).
					Msg("捕获到异常")

				// 返回更具体的错误信息（建议开发环境显示，生产环境隐藏细节）
				c.JSON(http.StatusInternalServerError, gin.H{
					"code":    500,
					"message": "服务器内部错误",
					"error":   errMsg, // ⚠️ 生产环境建议移除
					"data":    nil,
				})

				// 中止后续处理
				c.Abort()
			}
		}()

		// 继续处理请求
		c.Next()
	}
}
